//package com.example.permissionservice.config;
//
//import com.fasterxml.jackson.annotation.JsonAutoDetect;
//import com.fasterxml.jackson.annotation.PropertyAccessor;
//import com.fasterxml.jackson.databind.ObjectMapper;
//import org.springframework.cache.CacheManager;
//import org.springframework.cache.annotation.CachingConfigurerSupport;
//import org.springframework.cache.interceptor.CacheErrorHandler;
//import org.springframework.cache.interceptor.KeyGenerator;
//import org.springframework.cache.interceptor.SimpleCacheErrorHandler;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.data.redis.cache.RedisCacheManager;
//import org.springframework.data.redis.connection.RedisConnectionFactory;
//import org.springframework.data.redis.core.RedisTemplate;
//import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
//import org.springframework.data.redis.serializer.StringRedisSerializer;
//
//import javax.annotation.Resource;
//
//@Configuration
//public class RedisConfig extends CachingConfigurerSupport {
//
//    @Resource
//    private RedisConnectionFactory factory;
//
////    /**
////     * 自定义生成redis-key
////     *
////     * @return
////     */
////    @Override
////    @Bean
////    public KeyGenerator keyGenerator() {
////        return (o, method, objects) -> {
////            StringBuilder sb = new StringBuilder();
////            sb.append(o.getClass().getName()).append(".");
////            sb.replace(0,21,"");
////            sb.append(method.getName()).append(".");
////            for (Object obj : objects) {
////                if (null!=obj){
////                    sb.append(obj.toString());
////                }
////            }
////            System.out.println("keyGenerator=" + sb.toString());
////            return sb.toString();
////        };
////    }
//
////    /*
////     * 要启用spring缓存支持,需创建一个 CacheManager的 bean，CacheManager 接口有很多实现，这里Redis 的集成，用
////     * RedisCacheManager这个实现类 Redis 不是应用的共享内存，它只是一个内存服务器，就像 MySql 似的，
////     * 我们需要将应用连接到它并使用某种“语言”进行交互，因此我们还需要一个连接工厂以及一个 Spring 和 Redis 对话要用的
////     * RedisTemplate， 这些都是 Redis 缓存所必需的配置，把它们都放在自定义的 CachingConfigurerSupport 中
////     */
////    @Bean
////    public CacheManager cacheManager(RedisConnectionFactory connectionFactory) {
////        RedisCacheManager rm = RedisCacheManager.create(connectionFactory);
////        /*rm.setDefaultExpiration(30L);// 设置缓存时间*/
////        return rm;
////    }
//
//    /*@Bean
//    @Override
//    public CacheResolver cacheResolver() {
//        return new SimpleCacheResolver(cacheManager());
//    }*/
//
////    @Bean
////    @Override
////    public CacheErrorHandler errorHandler() {
////        // 用于捕获从Cache中进行CRUD时的异常的回调处理器。
////        return new SimpleCacheErrorHandler();
////    }
//
//    // 1.项目启动时此方法先被注册成bean被spring管理,如果没有这个bean，
//    // 则redis可视化工具中的中文内容（key或者value）都会以二进制存储，不易检查。
//    @Bean
//    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
//        RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
//        template.setConnectionFactory(factory);
//        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
//        ObjectMapper objectMapper = new ObjectMapper();
//        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
//        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
//        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
//        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
//        // key采用String的序列化方式
//        template.setKeySerializer(stringRedisSerializer);
//        // hash的key也采用String的序列化方式
//        template.setHashKeySerializer(stringRedisSerializer);
//        // value序列化方式采用jackson
//        template.setValueSerializer(jackson2JsonRedisSerializer);
//        // hash的value序列化方式采用jackson
//        template.setHashValueSerializer(jackson2JsonRedisSerializer);
//        template.afterPropertiesSet();
//        return template;
//    }
//}